package com.example.watertest;



import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.andengine.audio.music.Music;
import org.andengine.audio.music.MusicFactory;
import org.andengine.audio.sound.Sound;
import org.andengine.audio.sound.SoundFactory;
import org.andengine.engine.Engine;
import org.andengine.engine.FixedStepEngine;
import org.andengine.engine.camera.Camera;
import org.andengine.engine.handler.physics.PhysicsHandler;
import org.andengine.engine.options.EngineOptions;
import org.andengine.engine.options.ScreenOrientation;
import org.andengine.engine.options.WakeLockOptions;
import org.andengine.engine.options.resolutionpolicy.FillResolutionPolicy;
import org.andengine.entity.IEntity;
import org.andengine.entity.modifier.IEntityModifier;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierListener;
import org.andengine.entity.modifier.IEntityModifier.IEntityModifierMatcher;
import org.andengine.entity.modifier.JumpModifier;
import org.andengine.entity.modifier.LoopEntityModifier;
import org.andengine.entity.modifier.ScaleModifier;
import org.andengine.entity.modifier.SequenceEntityModifier;
import org.andengine.entity.primitive.DrawMode;
import org.andengine.entity.primitive.Mesh;
import org.andengine.entity.primitive.Rectangle;
import org.andengine.entity.scene.IOnSceneTouchListener;
import org.andengine.entity.scene.Scene;
import org.andengine.entity.scene.background.Background;
import org.andengine.entity.sprite.AnimatedSprite;
import org.andengine.entity.sprite.Sprite;
import org.andengine.entity.text.Text;
import org.andengine.extension.physics.box2d.FixedStepPhysicsWorld;
import org.andengine.extension.physics.box2d.PhysicsConnector;
import org.andengine.extension.physics.box2d.PhysicsFactory;
import org.andengine.extension.physics.box2d.PhysicsWorld;
import org.andengine.extension.physics.box2d.util.Vector2Pool;
import org.andengine.extension.physics.box2d.util.constants.PhysicsConstants;
import org.andengine.extension.physics.box2d.util.triangulation.EarClippingTriangulator;
import org.andengine.input.sensor.acceleration.AccelerationData;
import org.andengine.input.sensor.acceleration.IAccelerationListener;
import org.andengine.input.touch.TouchEvent;
import org.andengine.opengl.font.Font;
import org.andengine.opengl.font.FontFactory;
import org.andengine.opengl.texture.ITexture;
import org.andengine.opengl.texture.TextureOptions;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlas;
import org.andengine.opengl.texture.atlas.bitmap.BitmapTextureAtlasTextureRegionFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.texture.region.ITiledTextureRegion;
import org.andengine.opengl.util.GLState;
import org.andengine.ui.activity.BaseGameActivity;
import org.andengine.ui.activity.SimpleBaseGameActivity;
import org.andengine.util.adt.color.Color;
import org.andengine.util.adt.list.ListUtils;
import org.andengine.util.modifier.IModifier;

import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;
import com.badlogic.gdx.physics.box2d.Fixture;
import com.badlogic.gdx.physics.box2d.FixtureDef;
import com.badlogic.gdx.physics.box2d.PolygonShape;
import com.badlogic.gdx.physics.box2d.joints.DistanceJointDef;
import com.badlogic.gdx.physics.box2d.joints.LineJointDef;
import com.badlogic.gdx.physics.box2d.joints.PrismaticJointDef;

import android.hardware.SensorManager;
import android.util.Log;




public class PrismaticJoints extends BaseGameActivity implements IOnSceneTouchListener {

	 public static int cameraWidth = 800;
	  public static int cameraHeight = 800;
	  public Scene mScene;
	  public FixedStepPhysicsWorld mPhysicsWorld;
	  Body PrismaticJointBodyA;
	  Body PrismaticJointBodyB;
	  final FixtureDef boxFixtureDef =
	    PhysicsFactory.createFixtureDef(20f, 0.2f, 0.9f);
	  
	  @Override
	  public Engine onCreateEngine(final EngineOptions
	      pEngineOptions) {
	    return new FixedStepEngine(pEngineOptions, 60);
	  }

	  @Override
	  public EngineOptions onCreateEngineOptions() {
	    EngineOptions engineOptions = new EngineOptions(true,
	      ScreenOrientation.LANDSCAPE_SENSOR, new
	        FillResolutionPolicy(), new Camera(0,
	          0, cameraWidth, cameraHeight));
	    engineOptions.getRenderOptions().setDithering(true);
	    engineOptions.getRenderOptions().
	      getConfigChooserOptions()
	        .setRequestedMultiSampling(true);
	    engineOptions.setWakeLockOptions(
	      WakeLockOptions.SCREEN_ON);
	    return engineOptions;
	  }

	  @Override
	  public void onCreateResources(OnCreateResourcesCallback pOnCreateResourcesCallback) {
	    pOnCreateResourcesCallback.
	      onCreateResourcesFinished();
	  }

	  @Override
	  public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback) {
	    mScene = new Scene();
	    mScene.setBackground(new Background(0.9f,0.9f,0.9f));
	    pOnCreateSceneCallback.onCreateSceneFinished(mScene);
	
	  }
	  
	  
	  @Override
	  public void onPopulateScene(Scene pScene, OnPopulateSceneCallback pOnPopulateSceneCallback) {
		  
		    mPhysicsWorld = new FixedStepPhysicsWorld(60, new
		    	      Vector2(0f,-SensorManager.GRAVITY_EARTH*2),
		    	        false, 8, 3);
	  		mScene.registerUpdateHandler(mPhysicsWorld);
	  		
	  		Rectangle PrismaticJointRectA = new Rectangle(228f, 240f, 30f, 30f,   this.getEngine().getVertexBufferObjectManager());
	  		PrismaticJointRectA.setColor(0.5f, 0.25f, 0f);
	  		mScene.attachChild(PrismaticJointRectA);
	  		PrismaticJointBodyA = PhysicsFactory.createBoxBody(mPhysicsWorld, 
	  				PrismaticJointRectA, BodyType.KinematicBody, boxFixtureDef);
	  		Rectangle PrismaticJointRectB = new Rectangle(228f, 200f, 30f, 30f,
	  		    this.getEngine().getVertexBufferObjectManager()) {
	  		  @Override
	  		  protected void onManagedUpdate(final float pSecondsElapsed) 
	  		  {
	  		    super.onManagedUpdate(pSecondsElapsed);
	  		  PrismaticJointBodyB.applyTorque(1000f);
	  		PrismaticJointBodyB.setAngularVelocity( Math.min(
	  				PrismaticJointBodyB.getAngularVelocity(),0.2f));
	  		  }
	  		};
	  		PrismaticJointRectB.setColor(0.75f, 0.375f, 0f);
	  		mScene.attachChild(PrismaticJointRectB);
	  		PrismaticJointBodyB = PhysicsFactory.createBoxBody(mPhysicsWorld, 
	  				PrismaticJointRectB, BodyType.DynamicBody, boxFixtureDef);
	  		mPhysicsWorld.registerPhysicsConnector(new PhysicsConnector(
	  				PrismaticJointRectB, PrismaticJointBodyB));
	  			  		
	  		
	  		final PrismaticJointDef prismaticJointDef = new PrismaticJointDef();
	  			prismaticJointDef.initialize(PrismaticJointBodyA,
	  			  PrismaticJointBodyB, PrismaticJointBodyA.getWorldCenter(), 
	  			    new Vector2(0.1f,0.5f));
	  			prismaticJointDef.collideConnected = false;
	  			prismaticJointDef.enableLimit = true;
	  			prismaticJointDef.lowerTranslation = -50f / 
	  			  PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT;
	  			prismaticJointDef.upperTranslation = 0f / 
	  			  PhysicsConstants.PIXEL_TO_METER_RATIO_DEFAULT;
	  			prismaticJointDef.enableMotor = true;
	  			prismaticJointDef.maxMotorForce = 400f;
	  			prismaticJointDef.motorSpeed = 500f;
	  			mPhysicsWorld.createJoint(prismaticJointDef);
	  		
		  mScene.setOnSceneTouchListener(this);
		  pOnPopulateSceneCallback.onPopulateSceneFinished();
				
	  }

	  @Override
	  public boolean onSceneTouchEvent(Scene pScene, TouchEvent
	      pSceneTouchEvent) {
		 
	    return true;
	  }

	
		
	
	
}
